/*
 * @Description: 
 * @Author: Jimmy
 * @Date: 2023-07-23 22:51:41
 * @LastEditTime: 2023-07-23 23:21:14
 * @LastEditors:  
 */
import bcrypt from 'bcryptjs'
import { Context, Next } from "koa";
import validate from "../utils/validator";
import { Rules } from "async-validator";
import UseService from '../service/user.service'
import { callbackData } from "../utils/data.handler";
import { access, sql } from "../logger";

interface IUser {
    username: string
    password: string
}
//登录用户信息基本规则校验
export const userValidator = async (ctx:Context,next:Next)=>{
    const rules: Rules = {
        username: {
            type: 'string',
            required: true,
            message: '用户名不能为空'
        },
        password: {
            type: 'string',
            required: true,
            message: '密码不能为空'
        }
    }
    const { error } = await validate<IUser>(ctx, rules);
    if(error){
        access.info('用户信息校验错误',{msg:error})
        console.error('用户信息校验错误',{msg:error})
        ctx.app.emit('error',callbackData('1',error),ctx);
        return false;
    }
    await next();
}

//用户是否存在库 校验
export const verifyUser = async (ctx:Context,next:Next)=>{
    const {username,phone,nickname} = ctx.request.body || {};
    try{
        let res = await UseService.getUserInfo({username,phone,nickname});
        if(res){
            sql.error('用户信息校验错误',{username})
            console.error('用户已存在',{username})
            ctx.app.emit('error',callbackData('2','用户已存在'),ctx);
            return false;
        }
    }catch(err){
        sql.error('查询用户信息发生错误',err)
        console.error('获取用户信息错误',err)
        ctx.app.emit('error',callbackData('2','用户注册错误'),ctx);
        return false;
    }
    await next();
}

//加密
export const cryptPassword = async (ctx:Context,next:Next)=>{
    let {password=''} = ctx.request.body || {};
    if(!password){
        access.info('密码不能为空')
        console.error('密码不能为空')
        ctx.app.emit('error',callbackData('1','密码不能为空'),ctx);
        return false;
    }
    let salt = bcrypt.genSaltSync(10);
    let hash = bcrypt.hashSync(password, salt);
    ctx.request.body.password = hash;
    await next();
}

//验证登录
export const verifyLogin = async(ctx:Context,next:Next)=>{
    const {username='',password=''} = ctx.request.body || {};
    //用户是否存在
    try{
        let res = await UseService.getUserInfo({username});
        if(!res){
            sql.info('用户不存在',{username})
            console.error('用户不存在',{username})
            ctx.app.emit('error',callbackData('2','用户不存在'),ctx);
            return false;
        }
        if(!res.status){
            sql.info('用户禁止使用',{username})
            console.error('用户禁止使用',{username})
            ctx.app.emit('error',callbackData('1','用户禁止使用'),ctx);
            return false;
        }
        //密码是否匹配
        if(!bcrypt.compareSync(password,res.password)){
            sql.error('用户密码错误')
            console.error('用户密码错误')
            ctx.app.emit('error',callbackData('1','用户密码错误'),ctx);
            return false;
        }
    }catch(err){
        sql.error('用户登录失败',err)
        console.error('用户登录失败',err)
        ctx.app.emit('error',callbackData('2','用户登录失败'),ctx);
        return false;
    }
    await next();
}
